組込み現場の「C++」プログラミング 明日から使える徹底入門

高木 信尚(株式会社クローバーフィールド

4.1 まず,C++の歴史を振り返ろう

本章の冒頭でも述べたように,少なくとも現時点では,C++の移植性はCほどは高くありません.組込み開発では,多種多様なプロセッサを対象とするというその特性から,そのことが問題になるかもしれません.たとえ,ある製品のソースコードを他のプロセッサに移植するようなことがないとしても,別の製品開発では異なるプロセッサを使用することは十分ありえますから,以前の開発時に確認したC++の振る舞いが,環境が変われば同じではなくなることがあります.これは,プロセッサが変わるからというよりは,むしろコンパイラが変わることに原因があります.したがって,プロセッサは同じ,または上位互換のものを使用する場合であっても,異なるベンダー製のコンパイラを採用した場合や,コンパイラのバージョンアップによっても起こりうるのです.

これはなにもC++に限ったことではありません.1990年代のCコンパイラでも同じようなことが起きていました.標準Cが制定されたのが1989年であり,標準準拠のコンパイラがあたりまえになるまである程度の時間がかかったように,1998年に制定された標準C++に準拠したコンパイラがあたりまえになるまでには時間がかかるのです.数年前に比べれば,現在の状況はかなり改善されています.おそらくこの状況は年々改善されていくことでしょう.

移植性について理解するには,C++が発展してきた歴史を踏まえて見たほうが理解が早いので,最初に,C++の歴史を振り返ってみましょう.

C++の原型は,Cをベースとし,Simula67からクラスの概念を取り入れた「クラス付きのC」(C with Classes)でした.その後,仮想関数や演算子多重定義など,現在のC++を構成する重要な要素を導入するための大幅な改定が行われ,1983年には「C++」という名称が与えられました.文字どおり,Cをインクリメントしたものの意味で,後置形式なのでCの原型をとどめていることを示唆しています(表4.1参照).

●表4.1 C++/Cの歴史

C++C
1978K&R第1版
1979C with Classes
1983C++の名称決定
1985C++ Release1.0
1989C++ Release2.0ANSI C
1990ARMISO C
1995Amendment1
1998ISO C++
1999C99
2003ISO C++訂正版
TR1
2009C++09?

最初のC++が開発されたのが1983年ですから,まだCの標準規格もできていない時代です.そうした事情もあり,C++で初めて導入された仕様の多くが元祖Cにも逆輸入されていきます.関数原型(プロトタイプ),void型,const修飾子など,現在のCではあたりまえの仕様のいくつかは,C++を起源とするものです.さらには,Cの現行規格であるC99では,ブロック途中での宣言,インライン関数,行コメント*1といったC++の仕様がCに導入されました.

さて,1983年の最初のC++から標準C++まで15年かかっています.当然,その間にC++はなんどもバージョンアップを重ねました.標準Cが制定された年と同じ1989年には,protected,多重継承,抽象クラス,静的メンバー関数,constメンバー関数など,大幅な改定が行われたバージョン2.0がリリースされました.翌1990年には,『Annotated C++ Reference Manual』(通称ARM)*2が出版され,標準C++の登場までの期間,実質的な標準仕様として扱われました.現在でも,ARM準拠の処理系がある程度は残っているようです.

この時点で,言語のコア部分の仕様はおおむね固まっていました.実引数依存の名前検索や一時オブジェクトの生存期間など,こまごまとした仕様変更が行われるなか,C++の世界を一変させるだけのインパクトを持った存在が現れました.標準テンプレートライブラリ(STL)です.STLが登場した当初,完全なSTLを扱えるC++コンパイラはほとんどありませんでした.しかし,STLの普及により,メンバー関数テンプレート,テンプレートの部分特殊化などの新しい仕様を多くのコンパイラがサポートするようになりました.そして1998年,標準C++が制定されたのです.その後,若干の修正を行った訂正版が2003年にリリースされ,これが現行規格となっています.

標準規格の制定後も,C++は進化を続けています.2005年にリリースされた「Library Technical Report 1」(TR1)は,次期標準を目指す大規模なライブラリ群であるBoost C++ Libraries*3からいくつかのライブラリを取り入れたほか,C99のライブラリの大多数も取り入れたライブラリ拡張であり,すでにこのTR1をサポートする処理系も現れ始めています.さらには,TR1のほか,言語のコア部分の拡張も含めた標準規格のメジャーバージョンアップが,2009年のリリースを目標に進行中です.予定どおり2009年にリリースできた場合には,現在C++0xという通称で呼ばれているこの次期標準規格は,C++09と呼ばれることになるでしょう.

*1 これは正確にはBCPL由来ですが…….

*2 邦題は『注解 C++リファレンスマニュアル』(トッパン刊).

*3 http://www.boost.org/